package be.vdab.gwt.cultuurhuis.client.managers;

import java.util.List;


import be.vdab.gwt.cultuurhuis.client.CultuurhuisService;
import be.vdab.gwt.cultuurhuis.client.CultuurhuisServiceAsync;
import be.vdab.gwt.cultuurhuis.shared.entities.Voorstelling;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

public class ApplicationManager {
	
	private final CultuurhuisServiceAsync cultuurhuisService = GWT.create(CultuurhuisService.class);	
	private HistoryManager hm; 
	private ScreenManager sm;
	
	private List<Voorstelling> voorstellingen;
	
	//Enables "this" to be referenced from inner classes
	private ApplicationManager me;
	

	public ApplicationManager(){
		init();
	}
	
	protected void init(){
		this.me = this;
		hm = new HistoryManager(this);
		sm = new ScreenManager(this);		
	}
		

	public void loadVoorstellingen() {
		cultuurhuisService.getVoorstellingen(new AsyncCallback<List<Voorstelling>>() {			
			@Override
			public void onSuccess(List<Voorstelling> result) {
				me.voorstellingen = result;
				for(Voorstelling v : result){
					sm.addVoorstellingToMenu(v);
				}
				History.fireCurrentHistoryState();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				showException(caught.getLocalizedMessage());
			}			
		});		
	}

	private void showException(String msg) {
		Label l = new Label(msg);
		l.setStyleName("error");
		RootPanel.get().add(l);		
	}

	public void showVoorstelling(String idAsString) {
		try{
			Long id = Long.parseLong(idAsString);
			Voorstelling v = findVoorstellingById(id, voorstellingen);
			sm.showVoorstelling(v);
						
		}catch(Exception ex){
			showException(ex.getLocalizedMessage());
		}		
	}
	
	private Voorstelling findVoorstellingById(Long id, List<Voorstelling> list) {
		for(Voorstelling v : list){
			if(v.getId()==id){
				return v;
			}
		}
		return null;
	}
	
	public void createVoorstelling(){
//		Voorstelling v = new Voorstelling()
//			.setNaam("[Nieuwe voorstelling]");
//		cultuurhuisService.addVoorstelling(v, new AsyncCallback<Voorstelling>() {
//			
//			@Override
//			public void onSuccess(Voorstelling result) {
//				me.sm.addVoorstellingToMenu(result);					
//			}
//			
//			@Override
//			public void onFailure(Throwable caught) {
//				me.handelException(caught);				
//			}
//		});
	}

	protected void handelException(Throwable ex) {
		this.sm.showException(ex);
		
	}

	public void showVoorstelling(Voorstelling v) {
		hm.newItem("voorstelling/"+v.getId());
		//The History Manager will respond to this and show the "voorstelling"
	}

	public void save(Voorstelling v) {
		cultuurhuisService.saveVoorstelling(v, new AsyncCallback<Voorstelling>() {
			
			@Override
			public void onSuccess(Voorstelling result) {
				//TODO: update all involved Widgets. TIP: Use the observer pattern! 
			}
			
			@Override
			public void onFailure(Throwable caught) {
				me.handelException(caught);
			}
		});
	}	
}
